import 'dart:io';

import 'package:path_provider/path_provider.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:tool/utils/file_utils.dart';

import '../../../base/base_model.dart';
import '../../../resources.dart';
import '../m/file_item_model.dart';

/// created by hcl
/// on 2025/5/9
/// FileManagerModel
/// desc
class FileManagerModel extends BaseModel {
  Directory? dir;
  String genDir = '';
  bool isOuter = false; //是否外部存储
  List<FileItemModel> list = [];

  @override
  initData() {
    initFile();
  }

  /// 通用可用目录
  /// getTemporaryDirectory,getApplicationCacheDirectory cache，适用于缓存文件，随时可以清除，应用程序私有目录，其他应用程序无法访问此目录。
  /// getApplicationSupportDirectory files,返回一个Future<Directory>对象，表示应用程序的支持目录,严格保密的数据。
  /// getApplicationDocumentsDirectory app_flutter,应用程序的文档目录。可持久性存储空间，通常存储用户生成的文件或其他数据。
  ///
  /// 安卓内部存储目录结构 code_cache：此目录存储 Flutter 相关代码和资源
  /// shared_prefs：SharePreferences（轻量级的本地存储） 的默认路径
  /// app_flutter/dbName：使用 sqlite（轻量级的关系型数据库） 的默认路径，sqlite也可以指定位置
  /// 安卓外部存储目录结构
  /// getExternalStorageDirectories files
  /// getExternalStorageDirectory files,应用程序可以访问顶级存储的目录的路径。仅Android可用
  /// getExternalCacheDirectories cache,存储特定于应用程序的外部缓存数据的目录的路径。
  ///
  /// 苹果可用目录
  /// getLibraryDirectory 返回应用程序的库目录。这个目录通常用于存储应用程序的共享库或插件。会报错。
  /// getTemporaryDirectory,getApplicationCacheDirectory tmp，存放临时文件，不会被备份，每三天清理一次。
  /// getApplicationDocumentsDirectory
  ///
  /// getDownloadsDirectory
  /// 存储下载文件的目录的路径，这通常仅与台式机操作系统有关。 在Android和iOS上，此函数将引发[UnsupportedError]异常。
  void initFile() {
    // getTemporaryDirectory /data/user/0/com.open.tool/cache
    // getApplicationDocumentsDirectory /data/user/0/com.open.tool/app_flutter
    // getExternalCacheDirectories /storage/emulated/0/Android/data/com.open.tool/cache
    // getExternalStorageDirectory /storage/emulated/0/Android/data/com.open.tool/cache
    requestPermission(Permission.storage).then((value) {
      if (value) {
        isOuter ? initOuter() : initInner();
      }
    });
  }

  void initOuter() {
    getExternalStorageDirectory().then((value) {
      if (value != null) {
        dir = value.parent;
        genDir = dir?.path ?? '';
        listFile();
      } else {
        initInner();
      }
    });
  }

  void initInner() {
    getApplicationDocumentsDirectory().then((value) {
      dir = value.parent;
      genDir = dir?.path ?? '';
      listFile();
    });
  }

  void listFile() {
    list.clear();
    var listList = dir?.listSync();
    listList?.forEach((fileSystemEntity) {
      list.add(FileItemModel(FileUtils.getFileName(fileSystemEntity.path),
          fileSystemEntity.path, fileSystemEntity is Directory));
    });
    notifyListeners();
  }

  void changeInnerOuter() {
    isOuter = !isOuter;
    initFile();
  }

  void goParent() {
    if (dir?.parent != null && dir?.path != (isOuter ? realGenDir : genDir)) {
      dir = dir?.parent;
      listFile();
    } else {
      showToast('已到最顶部');
    }
  }

  void goNext(FileItemModel itemModel) {
    if (itemModel.isDir) {
      dir = Directory(itemModel.path);
      listFile();
    } else {
      showToast('功能未开放，敬请期待');
    }
  }
}
